use tracing::info;
use crate::message::Message;
use crate::CODE_ACTIVE_KEY;
use windows::core::HSTRING;
use windows::Data::Xml::Dom::XmlDocument;
use windows::UI::Notifications::{ToastNotification, ToastNotificationManager};


/// 显示系统通知并发送请求进行内容确认
///
/// # 参数
/// - `msg` - `Message`借用
///
/// # 返回值
/// 返回 `windows::core::Result<()>` 类型：
/// - `Ok(())` 表示通知发送成功
/// - `Err(e)` 包含Windows API错误详情
///
/// # 注意事项
/// 1. 该方法会发起网络链接请求
/// 2. 参数`msg`需要包含正确可访问的`url`链接
///
pub fn confirm_notification(msg: &Message) -> windows::core::Result<()> {
    let xml = XmlDocument::new()?;
    xml.LoadXml(&format!(
        r#"<toast>
            <visual>
                <binding template="ToastGeneric">
                    <text>{}</text>
                    <text>{}</text>
                </binding>
            </visual>
            <actions>
                <action activationType="background" arguments="action=confirm" content="确认"/>
            </actions>
            <audio src="ms-winsoundevent:Notification.Default"/>
        </toast>"#,
        msg.title, msg.body
    ).into())?;

    let toast = ToastNotification::CreateToastNotification(&xml)?;
    let notifier = ToastNotificationManager::CreateToastNotifierWithId(&HSTRING::from(CODE_ACTIVE_KEY))?;
    notifier.Show(&toast)?;

    info!("成功发起确认通知.");

    Ok(())
}

/// 发送系统通知并在用户点击时跳转到指定URL
///
/// # 参数
/// - `msg` - `Message`的借用
///
/// # 返回值
/// 返回 `windows::core::Result<()>` 类型：
/// - `Ok(())` 表示通知发送成功
/// - `Err(e)` 包含Windows API错误详情
///
/// # 注意事项
/// 1. 需要应用程序具有系统通知权限
/// 3. 在Win10+系统上效果最佳
pub fn link_notification(msg: &Message) -> windows::core::Result<()> {
    let xml = XmlDocument::new()?;
    let url = match msg.url.as_ref() {
        Some(url) => url,
        None => return Ok(()),
    };
    xml.LoadXml(&format!(
        r#"<toast>
            <visual>
                <binding template="ToastGeneric">
                    <text>{}</text>
                    <text>{}</text>
                </binding>
            </visual>
            <actions>
                <action activationType="protocol" arguments="{}" content="打开链接"/>
                <action activationType="system" arguments="dismiss" content="关闭"/>
            </actions>
            <audio src="ms-winsoundevent:Notification.Default"/>
        </toast>"#,
        msg.title, msg.body,url
    ).into())?;

    let toast = ToastNotification::CreateToastNotification(&xml)?;
    let notifier = ToastNotificationManager::CreateToastNotifierWithId(&HSTRING::from(CODE_ACTIVE_KEY))?;
    notifier.Show(&toast)?;

    info!("成功发起链接通知.");

    Ok(())
}


/// 基础消息显示（无交互仅显示）
///
/// # 参数
/// - `msg` - `Message`类型引用
///
/// # 返回值
/// - `windows::core::Result<()>`
/// - `OK` 发送系统消息成功
/// - `Err` 发生错误
///
/// # 注意事项
/// 1. 需要应用程序具有系统通知权限
/// 2. 在Win10+系统上效果最佳
pub fn basic_notification(msg: &Message) -> windows::core::Result<()> {
    let xml = XmlDocument::new()?;
    xml.LoadXml(&format!(
        r#"<toast>
            <visual>
                <binding template="ToastGeneric">
                    <text>{}</text>
                    <text>{}</text>
                </binding>
            </visual>
            <audio src="ms-winsoundevent:Notification.Default"/>
        </toast>"#,
        msg.title, msg.body
    ).into())?;

    let toast = ToastNotification::CreateToastNotification(&xml)?;
    let notifier = ToastNotificationManager::CreateToastNotifierWithId(&HSTRING::from(CODE_ACTIVE_KEY))?;
    notifier.Show(&toast)?;

    info!("成功发起基础通知.");

    Ok(())
}